rendernodeparser: Handle empty Cairo nodes
authorBenjamin Otte <otte@redhat.com>
Wed, 29 May 2019 03:48:38 +0000 (05:48 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 30 May 2019 13:32:36 +0000 (15:32 +0200)
Cairo nodes can contain a NULL surface if they have never been drawn to.
Make this the default Cairo node.

gsk/gskrendernodeparser.c
testsuite/gsk/compare/empty-cairo.png
testsuite/gsk/nodeparser/empty-cairo.ref.node

index 6dc1d19448e56a004551868a2138e58720472742..4cdf70f6309c44bda213f7cd6dae16d88cbdff7d 100644 (file)
@@ -1065,32 +1065,31 @@ parse_cairo_node (GtkCssParser *parser)
     { "script", parse_script, clear_surface, &surface }
   };
   GskRenderNode *node;
-  cairo_t *cr;
 
   parse_declarations (parser, declarations, G_N_ELEMENTS(declarations));
 
   node = gsk_cairo_node_new (&bounds);
   
-  cr = gsk_cairo_node_get_draw_context (node);
-
   if (surface != NULL)
     {
+      cairo_t *cr = gsk_cairo_node_get_draw_context (node);
       cairo_set_source_surface (cr, surface, 0, 0);
       cairo_paint (cr);
+      cairo_destroy (cr);
     }
   else if (pixels != NULL)
     {
+      cairo_t *cr = gsk_cairo_node_get_draw_context (node);
       surface = gdk_texture_download_surface (pixels);
       cairo_set_source_surface (cr, surface, 0, 0);
       cairo_paint (cr);
+      cairo_destroy (cr);
     }
   else
     {
-      gdk_cairo_set_source_rgba (cr, &GDK_RGBA ("FF00CC"));
-      cairo_paint (cr);
+      /* do nothing */
     }
 
-  cairo_destroy (cr);
   g_clear_object (&pixels);
   g_clear_pointer (&surface, cairo_surface_destroy);
 
@@ -2380,36 +2379,39 @@ render_node_print (Printer       *p,
         start_node (p, "cairo");
         append_rect_param (p, "bounds", &node->bounds);
 
-        array = g_byte_array_new ();
-        cairo_surface_write_to_png_stream (surface, cairo_write_array, array);
-        b64 = g_base64_encode (array->data, array->len);
+        if (surface != NULL)
+          {
+            array = g_byte_array_new ();
+            cairo_surface_write_to_png_stream (surface, cairo_write_array, array);
+            b64 = g_base64_encode (array->data, array->len);
 
-        _indent (p);
-        g_string_append_printf (p->str, "pixels: url(\"data:image/png;base64,%s\");\n", b64);
+            _indent (p);
+            g_string_append_printf (p->str, "pixels: url(\"data:image/png;base64,%s\");\n", b64);
 
-        g_free (b64);
-        g_byte_array_free (array, TRUE);
+            g_free (b64);
+            g_byte_array_free (array, TRUE);
 
 #ifdef CAIRO_HAS_SCRIPT_SURFACE
-        if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_RECORDING)
-          {
-            cairo_device_t *script;
+            if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_RECORDING)
+              {
+                cairo_device_t *script;
 
-            array = g_byte_array_new ();
-            script = cairo_script_create_for_stream (cairo_write_array, array);
+                array = g_byte_array_new ();
+                script = cairo_script_create_for_stream (cairo_write_array, array);
 
-            if (cairo_script_from_recording_surface (script, surface) == CAIRO_STATUS_SUCCESS)
-              {
-                b64 = g_base64_encode (array->data, array->len);
-                _indent (p);
-                g_string_append_printf (p->str, "script: url(\"data:;base64,%s\");\n", b64);
-                g_free (b64);
-              }
+                if (cairo_script_from_recording_surface (script, surface) == CAIRO_STATUS_SUCCESS)
+                  {
+                    b64 = g_base64_encode (array->data, array->len);
+                    _indent (p);
+                    g_string_append_printf (p->str, "script: url(\"data:;base64,%s\");\n", b64);
+                    g_free (b64);
+                  }
 
-          cairo_device_destroy (script);
-          g_byte_array_free (array, TRUE);
-        }
+              cairo_device_destroy (script);
+              g_byte_array_free (array, TRUE);
+            }
 #endif
+        }
 
         end_node (p);
       }
index 3a032a391ba59878cabf3e55f84ac5700bf00ff0..b4dff4c12fce4c886df27491d834376957aca2e1 100644 (file)
Binary files a/testsuite/gsk/compare/empty-cairo.png and b/testsuite/gsk/compare/empty-cairo.png differ
index 4dca846961ae13adfc4cfe7d7f17f749c309f299..841560aaa903f148975e7b775bbdeb0c3f167ec7 100644 (file)
@@ -1,5 +1,3 @@
 cairo {
   bounds: 0 0 50 50;
-  pixels: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABmJLR0QA/wD/AP+gvaeTAAAATklEQVRYhe3OMQHAIADAMJh/aXgCA3t6wZEoyNxjjfd8twP/tAqtQqvQKrQKrUKr0Cq0Cq1Cq9AqtAqtQqvQKrQKrUKr0Cq0Cq1Cq9AqDsEHAi9RKkB7AAAAAElFTkSuQmCC");
-  script: url("data:;base64,JSFDYWlyb1NjcmlwdAo8PCAvY29udGVudCAvL0NPTE9SX0FMUEhBIC93aWR0aCA1MCAvaGVpZ2h0IDUwID4+IHN1cmZhY2UgY29udGV4dAoxIDAgMC44IHJnYiBzZXQtc291cmNlCnBhaW50CnBvcAo=");
 }